package com.lmy.jedis;

import org.junit.Test;
import redis.clients.jedis.Jedis;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Jedis_ {

    private static final String redisHost = "192.168.45.128";

    private static final int redisPort = 6379;

    private static final String redisPassword = "lmy";

    //连接到redis
    //1. 如果redis配置了密码，需要进行身份校验
    //2. 因为需要连接到redis的端口，就需要配置远程连接防火墙放开端口
    //3. 修改redis配置文件的 bind，支持远程连接(注销127.0.0.1)
    @Test
    public void con() {
        Jedis jedis = new Jedis(redisHost, redisPort);
        //如果redis配置了密码，则需要进行身份校验
        jedis.auth(redisPassword);
        String result = jedis.ping();
        System.out.println("连接成功  PING返回结果=" + result);
        //关闭当前连接，并没有关闭远程redis服务
        jedis.close();
    }

    //key操作
    @Test
    public void key() {
        Jedis jedis = new Jedis(redisHost, redisPort);
        //如果redis配置了密码，则需要进行身份校验
        jedis.auth(redisPassword);

        //设置key
        jedis.set("k1", "v1");
        jedis.set("k2", "v2");
        jedis.set("k3", "v3");

        //获取key
        Set<String> keys = jedis.keys("*");
        for (String key : keys) {
            System.out.println("key==>" + key);
        }

        //判断key是否存在，ttl
        System.out.println(jedis.exists("k1")); //true
        System.out.println(jedis.ttl("k2"));    //过期时间，默认-1永不过期
        System.out.println(jedis.get("k3"));    //获取k3的值

        //关闭连接
        jedis.close();
    }

    //操作字符串
    @Test
    public void string() {
        Jedis jedis = new Jedis(redisHost, redisPort);
        //如果redis配置了密码，则需要进行身份校验
        jedis.auth(redisPassword);

        //批量设置k-v
        jedis.mset("k1", "jack1", "k2", "scott", "k3", "lmy");
        //批量获取k-v
        List<String> mget = jedis.mget("k1", "k2", "k3");
        for (String s : mget) {
            System.out.println("val==>" + s);
        }
        //关闭连接
        jedis.close();
    }

    //操作列表
    @Test
    public void list() {
        Jedis jedis = new Jedis(redisHost, redisPort);
        //如果redis配置了密码，则需要进行身份校验
        jedis.auth(redisPassword);

        //从表头添加数据
        jedis.lpush("name_list", "jack", "tom", "nono");
        //获取数据
        List<String> nameList = jedis.lrange("name_list", 0, -1);
        for (String s : nameList) {
            System.out.println("val==>" + s);
        }
        //关闭连接
        jedis.close();
    }

    //操作集合
    @Test
    public void set() {
        Jedis jedis = new Jedis(redisHost, redisPort);
        //如果redis配置了密码，则需要进行身份校验
        jedis.auth(redisPassword);

        //添加数据，在redis中以16进制存放中文数据
        jedis.sadd("city", "北京", "上海");
        jedis.sadd("city", "广州", "深圳");

        //获取数据
        Set<String> city = jedis.smembers("city");
        for (String s : city) {
            System.out.println("val==>" + s);
        }

        //关闭连接
        jedis.close();
    }

    //操作hash
    @Test
    public void hash() {

        Jedis jedis = new Jedis(redisHost, redisPort);
        //如果redis配置了密码，则需要进行身份校验
        jedis.auth(redisPassword);

        //添加数据
        jedis.hset("hash01", "name", "李白");
        jedis.hset("hash01", "age", "30");

        //获取数据
        String name = jedis.hget("hash01", "name");
        System.out.println("name==>" + name);

        //也可以直接存放map
        Map<String, String> hashMap = new HashMap<>();
        hashMap.put("job", "java工程师");
        hashMap.put("name", "smith");
        hashMap.put("email", "smith@qq.com");
        jedis.hset("hash02", hashMap);

        //全部取出
        Set<String> hash02Keys = jedis.hkeys("hash02");
        for (String s : hash02Keys) {
            String hget = jedis.hget("hash02", s);
            System.out.println("key==>" + s + " val==>" + hget);
        }

        //关闭连接
        jedis.close();

    }

    //操作有序集合
    @Test
    public void zset() {

        Jedis jedis = new Jedis(redisHost, redisPort);
        //如果redis配置了密码，则需要进行身份校验
        jedis.auth(redisPassword);

        //添加数据
        jedis.zadd("hero", 1, "关羽");
        jedis.zadd("hero", 2, "张飞");
        jedis.zadd("hero", 3, "赵云");
        jedis.zadd("hero", 4, "马超");
        jedis.zadd("hero", 5, "黄忠");

        //取出数据，默认按照评分从低到高排序
        Set<String> heros = jedis.zrange("hero", 0, -1);
        for (String hero : heros) {
            System.out.println("hero==>" + hero);
        }

        //关闭连接
        jedis.close();
    }
}
